<?php
if (!function_exists('build_ranstr')) {
    /**
     * 获取随机字符
     * @param Number  $length 长度
     * @return Bool   $special 是否包含特殊符号
     * @return String 返回随机字符串
     */
    function build_ranstr($len = 8, $special = false)
    {
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );

        if ($special) {
            $chars = array_merge($chars, array(
                "!", "@", "#", "$", "%", "^", "&", "*", "(", ")",
                "_", "+", "-", "=", "{", "}", "[", "]", "|", ":", ";",
                "'", "\"", "<", ">", "?", "/", "`", "~", ",", "."
            ));
        }

        $charsLen = count($chars) - 1;
        shuffle($chars); //打乱数组
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            // .= 用于连接字符串
            $str .= $chars[mt_rand(0, $charsLen)]; //随机取出一位
        }

        return $str;
    }
}

// 用于检查指定的函数是否已经定义
if (!function_exists('showMsg')) {
    /**
     * 跳转提示
     * @param string $msg 提示信息
     * @param string $url 跳转地址
     * @param int $wait 等待时间
     * @param array
     */

    function showMsg($msg, $url = null)
    {
        $str = '';
        if ($url) {
            $str = "<script>
                alert('{$msg}');
                location.href='{$url}';
            </script>";
        } else {
            $str = "<script>
                alert('{$msg}');
                history.go(-1);
            </script>";
        }

        echo $str;
        exit;
    }
}


// 查询单条数据函数
if (!function_exists('find')) {
    /**
     * 查询单条数据
     * @param string $sql 查询语句
     * @return array 返回结果集
     */
    function find($sql)
    {
        // 声明全局变量
        global $conn;

        // 执行sql语句
        $result = mysqli_query($conn, $sql);

        // 存放的结果数组
        $data = [];

        if ($result && mysqli_num_rows($result) > 0) {
            $data = mysqli_fetch_assoc($result);
        }

        return $data;
    }
}

// 查询多条数据函数
if (!function_exists('findAll')) {
    /**
     * 查询多条数据
     * @param string $sql 查询语句
     * @return array 返回结果集
     */
    function findAll($sql)
    {
        global $conn;

        $result = mysqli_query($conn, $sql);

        $data = [];

        if ($result && mysqli_num_rows($result) > 0) {
            while ($row = mysqli_fetch_assoc($result)) {
                $data[] = $row;
            }
        }

        return $data;
    }
};


// 添加数据函数
if (!function_exists('add')) {
    /**
     * @param string $table 表名
     * @param array $data 插入的数据
     * @return array 返回结果集
     */
    function add($table, $data)
    {
        global $conn, $prefix;

        // 需要表前缀再拼接起来
        $table = $prefix . $table;

        $keys = array_keys($data);

        // 字段列
        $fields = '`' . implode('`,`', $keys) . '`';

        // 字段列的值
        $values = "'" . implode("','", $data) . "'";

        // 组装sql语句
        $sql = "INSERT INTO `$table`($fields)VALUES($values)";

        $res = mysqli_query($conn, $sql);

        if ($res) {
            return [
                'code' => 1,
                'msg' => '插入数据成功',
                'data' => mysqli_insert_id($conn)
            ];
        } else {
            return [
                'code' => 0,
                'msg' => '插入数据失败',
                'data' => mysqli_error($conn)
            ];
        }
    }
};

// 查询数据函数
if (!function_exists('all')) {
    /**
     * @param string $sql SQL语句
     * @return array 返回结果集
     */
    function all($sql)
    {
        global $conn;

        $result = mysqli_query($conn, $sql);

        $data = [];

        if ($result && mysqli_num_rows($result) > 0) {
            $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
        }
        return $data;
    }
};

// 更新数据函数
if (!function_exists('upd')) {
    /**
     * @param string $table 表名
     * @param array $data 更新的数据
     * @param string $where 条件
     * @return array 返回结果集
     */
    function upd($table, $data, $where)
    {
        global $conn, $prefix;

        // 需要表前缀再拼接起来
        $table = $prefix . $table;

        // 统计数组长度
        $len = count($data);
        // 拼接更新的字段与数据
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            if ($i == $len - 1) {
                $str .= '`' . array_keys($data)[$i] . '` = \'' . $data[array_keys($data)[$i]] . '\'';
            } else {
                $str .= '`' . array_keys($data)[$i] . '` = \'' . $data[array_keys($data)[$i]] . '\',';
            }
        }
        echo $str . "<br>";

        // 组装sql语句
        $sql = "UPDATE `$table` SET $str WHERE `id` = $where";

        $res = mysqli_query($conn, $sql);

        if ($res) {
            return [
                'code' => 1,
                'msg' => '更新数据成功',
                'data' => mysqli_insert_id($conn)
            ];
        } else {
            return [
                'code' => 0,
                'msg' => '更新数据失败',
                'data' => mysqli_error($conn)
            ];
        }
    }
}

// 删除数据函数
if (!function_exists('del')) {
    /**
     * 删除数据
     *
     * @param string $table 表名
     * @param string $where 条件
     * @return array 返回结果集
     */
    function del($table, $where)
    {
        global $conn, $prefix;

        // 需要表前缀再拼接起来
        $table = $prefix . $table;

        // 组装sql语句
        $sql = "DELETE FROM `$table` WHERE `id` = $where";

        $res = mysqli_query($conn, $sql);
        if ($res) {
            return [
                'code' => 1,
                'msg' => '删除数据成功',
                'data' => mysqli_insert_id($conn)
            ];
        } else {
            return [
                'code' => 0,
                'msg' => '删除数据失败',
                'data' => mysqli_error($conn)
            ];
        }
    }
}


// 判断是否登录函数
if (!function_exists('checkAuth')) {

    /**
     * 验证是否登录
     *
     */
    function checkAuth()
    {

        $LoginAdmin = isset($_COOKIE['LoginAdmin']) ? json_decode($_COOKIE['LoginAdmin'], true) : [];
        // print_r($LoginAdmin);

        if (!$LoginAdmin) {

            showMsg('请先登录', 'login.php');
        };

        $id = $LoginAdmin['id'] ?? 0;
        $username = $LoginAdmin['username'] ?? '';
        // echo $id;
        // echo $username;
        $sql = "SELECT `id`,`username`,`avatar` FROM `pre_admin` WHERE `id`='$id' AND `username` = '$username'";
        $admin = find($sql);
        // print_r($admin);
        // echo $admin['id'];
        if (!$admin) {
            setcookie('LoginAdmin', '', time() - 1);
            showMsg('非法登录', 'login.php');
        }
        // 更新cookie
        setcookie('LoginAdmin', json_encode($admin));
        // 返回查询的信息给试图调用
        return $admin;
    }
}

// 请求成功函数
if (!function_exists('success')) {
    /**
     * 请求成功返回操作
     * @param string $msg 提示信息
     * @param ?array $data 返回数据
     * @param int $code 状态码
     * @return json 返回结果
     */
    function success($msg, $data = null, $code = 1)
    {
        echo json_encode(['msg' => $msg, 'data' => $data, 'code' => $code]);
        exit;
    }
}

// 请求失败函数
if (!function_exists('error')) {
    /**
     * 请求失败返回操作
     * @param string $msg 提示信息
     * @param ?array $data 返回数据
     * @param int $code 状态码
     * @return json 返回结果
     */
    function error($msg, $data = null, $code = 0)
    {
        echo json_encode(['msg' => $msg, 'data' => $data, 'code' => $code]);
        exit;
    }
}

// 文件上传函数
if (!function_exists('build_upload')) {
    /**
     * 单图上传
     * @param string $name 接收到的图片名
     * @param string $path 指定的存放路径
     * @param array $typeArray 指定的图片类型
     * @param int $size 指定的图片大小
     * @return array 返回结果集 
     */
    function build_upload($name, $path = 'uploads', $typeArray = ['png', 'jpeg', 'gif', 'jpg'], $size = 1048576)
    {
        // 获取上传的时间
        $date = date('Ymd', time());
        // 拼接存放文件的文件夹路径
        $path = $path . '/' . $date;

        // 判断指定的存放文件夹是否存在
        if (!is_dir($path)) {

            mkdir($path, 0755, true);
        }

        // 返回结果数组
        $result = [
            'code' => 0,
            'msg' => '未知信息',
            'data' => null
        ];

        // 获取文件错误码
        $errorCode = $_FILES[$name]['error'];

        switch ($errorCode) {
            case 1:
                $result['msg'] = '上传大小不能超过upload_max_filesize设置的值';
                return $result;
            case 2:
                $result['msg'] = '上传大小不能超过MAX_FILE_SIZE设置的值';
                return $result;

            case 3:
                $result['msg'] = '上传图片不完整';
                return $result;

            case 4:
                $result['msg'] = '没有选择上传的图片';
                return $result;
        }

        // 获取文件后缀(pathinfo()函数获取文件信息, PATHINFO_EXTENSION获取文件后缀)
        $ext = pathinfo($_FILES[$name]['name'], PATHINFO_EXTENSION);

        // 判断文件后缀是否不存在指定类型
        if (!in_array($ext, $typeArray)) {
            $result['msg'] = '上传图片的类型错误';
            return $result;
        }

        // 图片大小
        if ($_FILES[$name]['size'] > $size) {
            $result['msg'] = '图片过大,请压缩后上传';
            return $result;
        }

        // 设置图片保存后的名称 20240217095223990000.jpg
        $filename = date('YmdHis', time()) . mt_rand(1000, 9999) . mt_rand(1000, 9999) . '.' . $ext;

        // 判断文件是否通过http post上传
        if (is_uploaded_file($_FILES[$name]['tmp_name']) === true) {
            // 检查文件是否合法上传
            if (@move_uploaded_file($_FILES[$name]['tmp_name'], $path . '/' . $filename) === true) {
                $result = [
                    'code' => 1,
                    'msg' => '上传成功',
                    'data' => '/' . $path . '/' . $filename
                ];
            } else {
                $result['msg'] = '上传失败';
            }
        } else {
            $result['msg'] = '上传错误';
        }

        return $result;
    }
}

// 获取url地址函数
if (!function_exists('getUrl')) {
    /**
     * 获取当前url并且封装
     *
     */
    function getUrl()
    {

        // 获取当前完整的地址
        $url = $_SERVER['PHP_SELF'] . '?';


        if ($_GET) {
            foreach ($_GET as $key => $value) {
                if ($key != 'page') {
                    $url .= $key . '=' . $value . '&';
                }
            }
        }
        return $url;
    }
}

// 分页函数
if (!function_exists('page')) {
    /**
     * 分页函数
     * @param int string $current 当前页
     * @param int $count 数据总数
     * @param int $limit 每页显示多少条数据
     * @param int $size 显示页码
     * @param string $class 分页样式
     * @return string 分页HTML结构
     */
    function showPage($current, $count, $limit = 2, $size = 5, $class = 'digg')
    {
        // 存放的结构变量
        $page = '';

        // 判断是否分页
        if ($count > $limit) {
            // 计算总页数
            $pageCount = ceil($count / $limit);

            // 获取地址
            $url = getUrl();

            // 开始的标签
            $page .= '<div class="' . $class . '">';

            // 第一页
            if ($current == 1) {
                $page .= '<span class="disabled">首页</span>';
                $page .= '<span class="disabled">上一页</span>';
            } else {
                $page .= '<a href="' . $url . 'page=1">首页</a>';
                $page .= '<a href="' . $url . 'page=' . ($current - 1) . '">上一页</a>';
            }

            // 当前页在中间位置靠左时，floor()向下取整
            if ($current <= floor($size / 2)) {
                // 起始页码
                $start = 1;
                // 如果总页数大于中间显示多少页，结束数字就是中间显示多少页，否则结束数字是总页数
                // 结束页码
                $end = $pageCount > $size ? $size : $pageCount;
            } else if ($current >= $pageCount - floor($size / 2)) {
                // 当前页在中间位置靠右，避免页数出现0或者负数
                $start = $pageCount - $size + 1 <= 0 ? 1 : $pageCount - $size + 1;
                $end = $pageCount;
            } else {
                // 当前页在中间位置
                $start = $current - floor($size / 2);
                $end = $current + floor($size / 2);
            }

            for ($i = $start; $i <= $end; $i++) {
                if ($i == $current) {
                    $page .= '<span class="current">' . $i . '</span>';
                } else {
                    $page .= '<a href="' . $url . 'page=' . $i . '">' . $i . '</a>';
                }
            }
            // 最后一页
            if ($current == $pageCount) {
                $page .= '<span class="disabled">下一页</span>';
                $page .= '<span class="disabled">尾页</span>';
            } else {
                $page .= '<a href="' . $url . 'page=' . ($current + 1) . '">下一页</a>';
                $page .= '<a href="' . $url . 'page=' . $pageCount . '">尾页</a>';
            }

            // 结束标签
            $page .= '</div>';
        }
        return $page;
    }
}
